﻿using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlTypes;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using WindowsFormsAppDatabase;

namespace Calendar
{

    public partial class main : Form
    {
        //创建label数组 存放label标签
        Label[] label = new Label[35];
        //创建textbox数组 存放textbox标签
        TextBox[] text = new TextBox[35];
        //实例化数据库对象
        Dao dao = new Dao();
        //初始化一个参数 在切换年月时改变其bool值
        bool flagSql = true;

        public main()
        {
            InitializeComponent();
            dao.connect();
            //初始化label数组 必须先初始化数组再初始化当前时间
            //否则year和month的valueChange事件会出问题
            initLabel();
            //初始化评论数组
            initTextBox();

            //初始化当前系统时间
            initCurrnenTime();
            //初始化日历
            initCalendar((int)this.year.Value, (int)this.month.Value);
            //显示所有评论
            showAllComments();
            //设置当前日期背景颜色
            setCurrentDayBackGroundColor();


            // 动态绑定所有 TextBox 的 TextChanged 事件
            for (int i = 1; i <= 35; i++)
            {
                TextBox textbox = Controls.Find($"textBox{i}", true).FirstOrDefault() as TextBox;

                if (textbox != null)
                {
                    textbox.TextChanged += TextBox_TextChanged;
                }
            }



        }

        //设置当前日期背景颜色
        //获取系统日期 与NumberUpAndDown中的值进行比较 如果相等就给这天添加背景颜色
        private void setCurrentDayBackGroundColor()
        {
            CalculateCalendar c = new CalculateCalendar();
            //获取系统日期
            int week = c.Date((int)this.year.Value, (int)this.month.Value, 1);
            int year = int.Parse(DateTime.Now.ToString("yyyy")) ;
            int month = int.Parse(DateTime.Now.ToString("MM")) ;
            int day = int.Parse(DateTime.Now.ToString("dd")) ;
            // 与NumberUpAndDown中的值进行比较 如果相等就给这天添加背景颜色
            if (year == this.year.Value && month == this.month.Value)
            {
                text[week + day - 1].BackColor = Color.LightYellow;
            }
        }
        
        private void TextBox_TextChanged(object sender, EventArgs e)
        {
            dao.connect();
            CalculateCalendar c = new CalculateCalendar();
            // 共用的处理函数，用于处理所有 TextBox 的 TextChanged 事件
            //sender对象为object类型 可以接收全部的textbox标签
            TextBox textBox = (TextBox)sender;
            if (textBox != null)
            {
                //只有当flagSql为true时才会执行
                //因为切换页面时会初始化其时间对应的文本框 会触发TextChanged事件
                //因此在切换时间时将flag置为false 
                if (flagSql)
                {
                    // 在这里执行对数据库的赋值操作，使用 textBox.Text 来获取文本值
                    //进行sql操作所需要的参数为时间
                    //需要先判断是添加 还是修改操作 所以要先获取所选框的日期
                    //获取选中的textbox
                    //现在textbox可以获取到名字， 因为textbox的命名为textbox1-textbox35
                    //所以可以使用截取字符串的方式获取是第几个框
                    int num = int.Parse(textBox.Name.Substring(7));
                    //获取年
                    int sqlYear = (int)year.Value;
                    //获取月
                    int sqlMonth = (int)month.Value;
                    //获取本月第一天信息
                    int week = c.Date(sqlYear, sqlMonth, 1);
                    int sqlDay = num - week;
                    //拼接日期条件
                    string time = $"{sqlYear}/{sqlMonth}/{sqlDay}";
                    //判断是添加还是修改
                    if (selectTable(time))
                    {
                        //存在 修改操作
                        //拼接sql字符串
                        string sql = $"update comments set text = '{textBox.Text}' where time = '{time}';";
                        //执行sql
                        dao.Execute(sql);
                    }
                    else
                    {
                        //不存在 添加操作
                        string sql = $"insert into comments (time,text) values ('{time}','{textBox.Text}');";
                        dao.Execute(sql);
                    }
                }
                

            }
            dao.close();
        }



        
        //初始化年月 设置为当前时间
        void initCurrnenTime()
        {
            string year = DateTime.Now.ToString("yyyy");
            string month = DateTime.Now.ToString("MM");
            this.year.Value = int.Parse(year);
            this.month.Value = int.Parse(month);
        }


        //初始化lable 日历数组 将全部的label标签放入数组中
        void initLabel()
        {

            for (int i = 1; i <= label.Length; i++)
            {
                // 使用 Controls 集合和字符串拼接构造控件的名称
                string name = "label" + i;
                // 在窗体控件集合中查找对应名称的 Label 控件
                Label currentLabel = Controls.Find(name, true).FirstOrDefault() as Label;
                // 如果找到了对应的 Label 控件，则将其添加到数组中
                if (currentLabel != null)
                {
                    label[i - 1] = currentLabel;
                }

            }
        }
        void initTextBox()
        {
            for (int i = 1; i <= text.Length; i++)
            {
                // 使用 Controls 集合和字符串拼接构造控件的名称
                string name = "textBox" + i;
                // 在窗体控件集合中查找对应名称的 textBox 控件
                TextBox currentTextBox = Controls.Find(name, true).FirstOrDefault() as TextBox;
                // 如果找到了对应的 textBox 控件，则将其添加到数组中
                if (currentTextBox != null)
                {
                    text[i - 1] = currentTextBox;
                   // text[i - 1].Text = "";
                }

            }
        }
        /**
         * year: 年
         * month：月
         */
        void initCalendar(int year, int month)
        {
            //实例化CalculateCalendar对象
            CalculateCalendar c = new CalculateCalendar();
            //判断这个月的第一天是周几
            int week = c.Date(year, month, 1);
            //将前面几天的label标签内容用空格代替
            for (int i = 1; i <= week; i++)
            {
                label[i].Text = "";
            }
            //一个月的最大天数
            int maxDay = c.DayNumOfMonth(year, month);
            for (int j = 1, i = week; j <= maxDay && i < 35; i++, j++)
            {
                label[i].Text = j.ToString();
            }
            
        }


        //展示所有评论
        void showAllComments()
        {
            dao.connect();
            for (int i = 0; i < 35; i++)
            {
                //如果当前lable为空，就跳过
                if (label[i].Text == string.Empty) continue;
                string day = label[i].Text.ToString();
                string time = year.Value.ToString() + "/" + month.Value.ToString() + "/" + day;
                //查到了
                if (selectTable(time))
                {
                    //有数据
                    string info = getComments(time);
                    text[i].Text = info;
                }

            }
            dao.close();
        }

        private bool selectTable(string time)
        {
            string sql = "select * from comments";
            IDataReader dc = dao.read(sql);
            while (dc.Read())
            {
                string sqlTime = dc.GetString(1);
                //拿查询的时间和参数传过来的时间进行比较
                if(sqlTime == time)
                {
                    //存在
                    return true;
                }
            }
            //不存在
            return false;
        }

        //根据时间查询评论
        string getComments(string time)
        {
            string sql = $"select * from comments where time = '{time}'";
            IDataReader dc = dao.read(sql) ;
            string text = "";
            while (dc.Read())
            {
                text = dc.GetString(2);
            }
           
            return text;
        }

        //年份改变时触发
        private void year_ValueChanged(object sender, EventArgs e)
        {
            //先将标志置false 以免触发textboxChange事件
            flagSql = false;
            for (int i = 0; i < 35; i++)
            {
                //先将所有日期清空
                label[i].Text = "";
                //再将所有背景色置空
                text[i].BackColor = Color.White;
                    /*if (text[i] != null && text[i].Text == string.Empty) { continue; }
                    //清空文本框
                    text[i].Text = "";*/
            }
            //清空文本框
            foreach (TextBox textBox in text)
            {
                textBox.Text = string.Empty;
            }
            //根据当前年月重新给初始化日历
            initCalendar((int)this.year.Value, (int)this.month.Value);
                //显示所有评论
            showAllComments();
            //设置当前日期背景色
            setCurrentDayBackGroundColor();
            flagSql = true;
            
            
        }
        //与上面一样
        private void month_ValueChanged(object sender, EventArgs e)
        {

            
            flagSql = false;
            for (int i = 0; i < 35; i++)
            {
                //将日历清空
                label[i].Text = "";
                text[i].BackColor = Color.White;
            }
                //循环清空textbox的内容 卡了很久
            foreach (TextBox textBox in text)
            {
                textBox.Text = string.Empty;
            }
            initCalendar((int)this.year.Value, (int)this.month.Value);
                //显示所有评论
            showAllComments();
            //重新设置背景色
            setCurrentDayBackGroundColor();
            flagSql = true;
            
            
        }

        //最小化到托盘
        private void main_SizeChanged(object sender, EventArgs e)
        {
            //当窗体最小化时
            if (WindowState == FormWindowState.Minimized)
            {
                //隐藏窗体
                Hide();
                //将托盘图标设为显示
                notifyIcon1.Visible = true;
            }
            else
            {
                //将托盘图标设为隐藏
                notifyIcon1.Visible = false;
                //显示窗体
                Show();
            }

        }

        //双机托盘 显示窗体
        private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            //显示窗体
            this.Show();
            //恢复窗体尺寸状态
            this.WindowState = FormWindowState.Normal;
        }

        //开机自启 效果不好
        private void main_Load(object sender, EventArgs e)
        {

            try
            {
                // 获取当前用户的启动项注册表键
                RegistryKey currentUserKey = Registry.CurrentUser;
                RegistryKey runKey = currentUserKey.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);

                // 设置你的应用程序在启动时自动运行
                runKey.SetValue("Calendar", @"D:\Learn\c#\learn\Calendar\Calendar\bin\Debug\Calendar.exe");
                Console.WriteLine("开机自启动设置成功！");
            }
            catch (Exception ex)
            {
                Console.WriteLine("发生错误：" + ex.Message);
            }

        }
    }
}
